/**
 * 本工程模仿我的同事和我同时进行开发 练习git的冲突合并
 *
 *
 *yarn dev启动
 *我们推荐直接使用脚手架， 只需几条简单指令， 即可快速生成项目（ npm >=6.1.0 ） :
 1. $ mkdir egg-example && cd egg-example
 2. $ npm init egg --type=simple
 3. $ npm i
 快速初始化
 启动项目:
 1. $ npm run dev
 2. $ open http://localhost:7001


 *
 *安装egg-sequelize
 npm install egg-sequelize mysql2 --save // 下载mysql驱动插件
 npm install sequelize-cli --save-dev // 下载sequelize管理工具

 引入sequelize
 TODO 在 config/plugin.js 中引入 egg-sequelize 插件
 'use strict';

  /** @type Egg.EggPlugin
module.exports = {
    // had enabled by egg
    // static: {
    //   enable: true,
    // }
    sequelize:{
        enable:true,
        package:"egg-sequelize"
    }
};

 TODO 在 config/config.default.js 中编写 sequelize 配置
# 这里连接的是存服务数据的数据库
const config = exports = {
    sequelize: {
        dialect: "mysql",
        host: "localhost", // 数据库地址
        port: '3306',
        database: "test-db", // 数据库名称
        username: "root",
        password: "",
        timezone: "+08:00", // 东八时区
        dialectOptions: {
            useUTC: false // 输出为东八时区，但是不管用
        }
    }
};

初始化sequelize
创建相应数据库
在 egg 项目中，我们希望将所有数据库 Migrations 相关的内容都放在 database 目录下，所以我们在项目根目录下新建一个 .sequelizerc 配置文件：
 *
 *
 *todo 我们在根目录下创建一个文件：.sequelizerc ， 这是我们使用 Sequelize-cli 工具的时候读取的配置文件。
 *4-1、 配置选项
 todo 4-1-1、 env
 设置 Sequelize 的环境变量，默认读取系统的环境变量 NODE_ENV 的值，如果不存在 NODE_ENV
 则为 development 。该变量会影响下面config 的读取
 todo 4-1-1、 config
 Sequelize 数据库配置文件存放目录。
 todo 4-1-1、 models-path
 数据库模型文件存放目录。
 todo 4-1-1、 seeders-path
 数据库种子脚本文件存放目录。
 todo 4-1-1、 migrations-path
 数据库迁移脚本文件存放目录
 4-1-1、 debug
 是否显示详细的debug信息。
 *
 *
 * 按照上面 .sequelizerc 中的配置，我们在 configs 目录下创建一个 database.json 的数据
 * 库配置文件，它主要提供链接数据库所需要的一些配置。
 *
 * 6、 创建/销毁数据库
 做好以上的一些准备工作以后，下面我们就开始来使用 Sequelize-cli 来帮助我们完成第一个工作： 创建数据库。
 fixme 6-1、 sequelize db:create
 todo 这条命令可以帮助我们根据当前 env 值找到对应 datbase.json 中的配置，最后根据 database 项创建对应的数据库。
 * 这里是config.json
 *
 * 7、 数据库表结构的操作
 有了数据库，下面就需要在数据库中创建我们应用所需要用到的各种表以及表结构（字段）。这个时候就轮到前面提到的
 迁移脚本上场了！
 7-1、 创建迁移脚本文件
 首先，我们需要在前面定义的迁移脚本目录下创建一些迁移脚本，通常我们会为每一个表每次变更创建一个独立的迁移脚本。
 我们可以手动直接创建，也可以使用命令来创建。
 7-1-1、 sequelize migration:create
 ./node_modules/.bin/sequelize migration:create --name UserInit

 1
 使用这个命令，它可以自动在 migrations 目录下创建一个 时间-迁移文件名.js 的脚本文件。
 迁移文件的名称最好能比较直观的体现它的作用和目的。比如UserInit，表示这是一个初始化 User 表的操作。
 后续如果对 User 表进行更改，比如增加了一个用户状态的字段，那么可以创建一个 UserAddStatus 的迁移脚本文件。
 7-2、 编写迁移脚本
 脚本其实就是一个Node.js 代码，提供给 sequelize-cli 进行读取执行，每一个脚本通过 module.exports 导出
 一个包含了 down 和 up 方法的对象
 up：执行迁移命令（db:migrate ）的时候调用
 down：执行撤销/回滚命令（db:migrate:undo ）的时候调用
 7-2-1、queryInterface
 Sequelize 提供了一个 queryInterface 对象，该对象下又提供了许多操作数据库结构的各种方法（DDL），如：
 创建表、字段、索引等。
 7-2-1、Sequelize
 Sequelize 的核心类，提供了一些数据库相关的常量信息，比如数据类型，也可以进行实例化，用于对数据库中的数
 据进行操作（DQL 、 DML ）。
 7-2-1、up方法
 在 up 方法中，我们主要编写创建表结构，或者新增修改表结构的相关代码。
 up: async (queryInterface, Sequelize) => {

      up 需要返回一个 Promise
      queryInterface.createTable 方法用于创建表
        - 第一个参数是要创建的表的名称
        - 第二个参数是一个对象，用来描述表中包含的字段信息
        - queryInterface.createTable 返回一个 Promise

return queryInterface.createTable('User',{
    id:{
        //字段类型：数字
        type: Sequelize.INTEGER,
        //设置为主键
        primaryKey:true,
        //自动增长
        autoIncrement:true
    },
    name:{
        //字符串类型（20长度）
        type: Sequelize.STRING(20),
        //值唯一
        unique:true,
        //不允许 null 值
        allowNull: false
    },
    password:{
        //字符串类型（32长度）
        type: Sequelize.STRING(32),
        //不允许 null 值
        allowNull: false
    },
    createdAt: {
        //日期类型
        type: Sequelize.DATE,
        //不允许 null 值
        allowNull: false
    }
})
}


 fixme 7-3 执行迁移脚本
 sequelize db:migrate

 1
 命令执行成功以后，我们就可以在数据库中看到对应的表以及字段信息了。
 TODO 操作成功的同时数据库中会有一个叫做 SequelizeMeta 的表，这个表是用来记录我们已经执行过的迁移脚本的。
 当我们执行迁移命令的时候，它就会把当前执行的迁移脚本记录到该表中，下次执行迁移命令的时候就不会重复的去
 执行已经执行过的迁移脚本了。
 7-4、 撤销/回滚
 撤销/回滚 其实就是编写对应的 down脚本。
 7-4-1、 down脚本
 down 方法的本质就是 up 方法的一个反向操作。
 down: async (queryInterface, Sequelize) => {
	//删除 user 表
    return queryInterface.dropTable('User');
  }
 *
 * */
